package br.unirio.octopus.dados;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Query;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.TypedQuery;

import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Repository;

import br.unirio.octopus.dominio.Estadio;
import br.unirio.octopus.dominio.Fase;
import br.unirio.octopus.dominio.Jogo;
import br.unirio.octopus.dominio.Pais;
import br.unirio.octopus.dominio.Palpite;
import br.unirio.octopus.dominio.PalpiteVO;
import br.unirio.octopus.dominio.Usuario;
import br.unirio.octopus.excecao.ExcecaoDaAplicacao;

@Repository
public class RepositorioDePalpite extends RepositorioGenerico<Palpite, Integer> {

	public RepositorioDePalpite() {
		super(Palpite.class);
	}
	
	
	public List<PalpiteVO> obterJogosEPalpitesDeUsuario(Usuario usuario)
	{
		
		StringBuilder consulta = new StringBuilder( "select NEW br.unirio.octopus.dominio.PalpiteVO(p.idDoPalpite, j.diaEHorario, j.estadio.nomeDoEstadio, j.pais1.nomeDoPais, p.golsPais1, j.golsPais1, "
    + "j.pais2.nomeDoPais, p.golsPais2, j.golsPais2, p.pontosGanhos, j.pais1.codigoLongo,j.pais2.codigoLongo, j.numeroDoJogo,p.usuario.idDoUsuario)" );
		consulta.append(" FROM Jogo as j LEFT JOIN j.palpitesDoJogo as p");
		consulta.append(" ORDER BY j.diaEHorario");

		TypedQuery<PalpiteVO> queryJPA = getGerenciadorDeEntidade().createQuery(consulta.toString(), PalpiteVO.class);	

		List<PalpiteVO> resultado = queryJPA.getResultList();		
		
		return resultado;
	}
	
	public List<Palpite> obterPalpitesDeUsuario(Usuario usuario)
	{
		Query query = getGerenciadorDeEntidade().createQuery(
				"FROM Palpite where usuario = :user");
		query.setParameter("user", usuario);		
		return query.getResultList();
	}
	
	public Palpite obterPalpiteDeUsuarioPorIdDoJogo(Usuario usuario, Integer idDoJogo) throws ExcecaoDaAplicacao
	{
		Query query = getGerenciadorDeEntidade().createQuery(
				"FROM Palpite where usuario = :user AND jogo.numeroDoJogo = :jogo");
		query.setParameter("user", usuario);
		query.setParameter("jogo", idDoJogo);		
		List<Palpite> palpites = query.getResultList();
		if(!palpites.isEmpty()){
			if(palpites.size()>1){
				throw new ExcecaoDaAplicacao("erro.palpite");  
			}			
			return palpites.get(0);				
		}
		return null;

	}


}
